 /*******************************************************************************
  * Copyright (c) 2004, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.intro.impl.swt;

 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.ui.forms.IFormColors;
 import org.eclipse.ui.forms.widgets.Form;
 import org.eclipse.ui.forms.widgets.FormToolkit;
 import org.eclipse.ui.forms.widgets.ImageHyperlink;
 import org.eclipse.ui.forms.widgets.ScrolledPageBook;
 import org.eclipse.ui.internal.intro.impl.model.IntroLink;
 import org.eclipse.ui.internal.intro.impl.model.IntroModelRoot;
 import org.eclipse.ui.internal.intro.impl.util.ImageUtil;

 /**
  * Extends the UI of a PageForm and adds a navigation toolbar UI for the root
  * page links.
  */
 public class PageFormWithNavigation extends PageForm {

     private PageStyleManager rootPageStyleManager;

     // Id to this page. There is only a single instance of this page in the
 // main page book.
 public static String PAGE_FORM_WITH_NAVIGATION_ID = "pageFormWithNavigationId"; //$NON-NLS-1$


     /**
      *
      */
     public PageFormWithNavigation(FormToolkit toolkit,
             IntroModelRoot modelRoot, Form parentForm) {
         super(toolkit, modelRoot, parentForm);
     }

     /**
      * Extend parent behavior and add navigation.
      *
      * @param pageBook
      */
     public void createPartControl(ScrolledPageBook mainPageBook,
             SharedStyleManager sharedStyleManager) {

         super.createPartControl(mainPageBook, sharedStyleManager);

         // Create a style manager from shared style manager. We only need it
 // for the UI navigation composite.
 rootPageStyleManager = new PageStyleManager(model.getHomePage(),
             sharedStyleManager.getProperties());

         // Now create Navigation bar.
 Composite navigationComposite = toolkit.createComposite(pageForm
             .getBody());
         navigationComposite.setLayoutData(new GridData(
             GridData.HORIZONTAL_ALIGN_CENTER));
         int numberOfLinks = model.getHomePage().getLinks().length;
         GridLayout layout = new GridLayout();
         layout.numColumns = numberOfLinks;
         navigationComposite.setLayout(layout);
         createSmallNavigator(navigationComposite, model.getHomePage()
             .getLinks());

         pageForm.setText(rootPageStyleManager.getPageSubTitle());
     }

     /**
      * Override parent id.
      */
     protected String getId() {
         return PAGE_FORM_WITH_NAVIGATION_ID;
     }

     private void createSmallNavigator(Composite parent, IntroLink[] links) {
         for (int i = 0; i < links.length; i++) {
             Control c = createImageHyperlink(parent, links[i]);
             c.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
         }
         for (int i = 0; i < links.length; i++) {
             Label text = toolkit.createLabel(parent, links[i].getLabel());
             text.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
             text.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
         }
     }

     /**
      * Creates an Image Hyperlink from an IntroLink. Model object is NOT cached.
      *
      * @param body
      * @param link
      */
     private Control createImageHyperlink(Composite body, IntroLink link) {
         ImageHyperlink imageLink = toolkit.createImageHyperlink(body, SWT.NULL);

         // set link image.
 Image image = rootPageStyleManager.getImage(link, "small-link-icon", //$NON-NLS-1$
 ImageUtil.DEFAULT_SMALL_ROOT_LINK);
         imageLink.setImage(image);

         // set link hover image.
 image = rootPageStyleManager.getImage(link, "small-hover-icon", null); //$NON-NLS-1$
 imageLink.setHoverImage(image);
         imageLink.setToolTipText(link.getLabel());
         // each link is centered in cell.
 GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
         imageLink.setLayoutData(gd);
         imageLink.setHref(link.getUrl());
         imageLink.addHyperlinkListener(hyperlinkAdapter);
         return imageLink;
     }


 }

